#ifndef _STACK_HPP_
#define _STACK_HPP_

#include <string>
/**
 * Bereitstellung einer einfachen Stack-Funktionalität
 * mit den dazu benötigten structs.
 *
 * @author  Benjamin Friedrich, Ken Dahm
 * @version 1.0  07.01.2009
 */
namespace stack
{
	using namespace std;

	/**
	 * Die Struktur StackElement dient als Container
	 * für die Strings, die im Stack verwaltet werden
	 * sollen.
	 * StackElement.content - Eigentliche "Daten"
	 * StackElement.next    - StackElement "unter" dem StackElement
	 */
	struct StackElement
	{
		const string content;
		StackElement *next;
	};

	/**
	 * Struktur Stack, die den Stack repräsentiert.
	 * Stack.top  - oberstes Element auf dem Stack
	 * Stack.size - Anzahl Elemente in Stack
	 */
	struct Stack
	{
		StackElement *top;
		int          size;
	};

	/**
	 * Die Methode legt ein neues StackElement auf den Stack.
	 *
	 * @param stack      Stack auf den newElement gelegt wird
	 * @param newElement neues StackElement, welches auf den Stack gelegt wird
	 */
	void push(Stack &stack, StackElement &newElement);

	/**
	 * Nimmt das oberste Element vom Stack und gibt es zurück
	 *
	 * @param  stack Stack von dem das oberste Element genommen wird
	 * @return StackElement, welches zuletzt an oberer Stelle im Stack gelegen hat
	 */
	StackElement& pop(Stack &stack);

	/**
	 *	Erstellt ein String-Repräsentation des übergebenen Stack
	 *
	 *	@param  stack Stack zu dem die String-Repräsentation erstellt werden soll
	 *	@return String-Repräsentation von stack
	 */
	const string toString(Stack &stack);
}
#endif /* STACK_HPP_ */
